{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejemplo: Búsqueda de ceros de funciones\n",
    "Programemos la función `hallaZero`, a la que se le pasa una función `f` y un intervalo, y opcionalmente una tolerancia, y devuelve un cero en ese intervalo.\n",
    "Es necesario que la función tenga distinto signo en los extremos del intervalo. \n",
    "Utilizamos el método de la bisección, por su sencillez.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "def hallaCero(fun, inter, tol=1E-12):\n",
    "    izq, der = inter\n",
    "    fIzq, fDer = fun(izq), fun(der)\n",
    "    while True:\n",
    "        cen = 0.5 * (izq+der)\n",
    "        fCen = fun(cen)  # Invocacion a la funcion\n",
    "        if np.abs(fCen) < tol:\n",
    "            return cen\n",
    "        if np.sign(fIzq) == np.sign(fCen):\n",
    "            izq, fIzq = cen, fCen\n",
    "        else:\n",
    "            der, fDer = cen, fCen\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ejemplos de uso:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.cos(1.0)\n",
    "np.cos(2.0)\n",
    "cero = hallaCero(np.cos, (1.0, 2.0))\n",
    "soluc = np.pi / 2\n",
    "error = np.abs(cero - soluc)\n",
    "print(\"El valor real es %0.14f\" % soluc)\n",
    "print(\"El valor estimado es %0.14f\" % cero)\n",
    "print(\"El error es %.3e\" % error)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Ahora buscamos lo pedido: una aproximación de $\\sqrt{5}$. Lo que distingue a $\\sqrt{5}$ es que es un $x$ tal que $x^2=5$. O, de otro modo, un cero de la función $f(x) = x^2 - 5$. Usamos la función `hallaCero`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fun(x):\n",
    "    return x*x - 5\n",
    "\n",
    "raiz5Aprox = hallaCero(fun, (0.0, 100.0), tol=1E-12)\n",
    "print(\"El valor real es %0.15f\" % np.sqrt(5))\n",
    "print(\"El valor aprox es %0.15f\" % raiz5Aprox)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
